#include "MyI2c.h"

void I2C_Delay(void) {
    Delay_us(10);
}

void SDA_OUT1(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void SDA_IN1(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void MyI2C_W_SDA(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB,GPIO_Pin_1,(BitAction)BitValue);
	I2C_Delay();
}

void MyI2C_W_SCL(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)BitValue);
	I2C_Delay();
}

uint8_t MyI2C_R_SDA(void)
{
	uint8_t BitValue;
	BitValue = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1);
	I2C_Delay();
	return BitValue;
}

//PB11 SDA,	PB10 SCL
//PB0 SCL	,	PB1	 SDA
void MyI2C_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef  GPIO_Initstructure;
	GPIO_Initstructure.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_Initstructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_0;
	GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_Initstructure);
	
	GPIO_SetBits(GPIOB,GPIO_Pin_0 | GPIO_Pin_1);
}

void MyI2C_Start(void)
{
	SDA_OUT1();
	MyI2C_W_SDA(1);
	I2C_Delay();
	
	MyI2C_W_SCL(1);
	I2C_Delay();
	
	MyI2C_W_SDA(0);
	I2C_Delay();
	MyI2C_W_SCL(0);
	I2C_Delay();
}

void MyI2C_Stop(void)
{
	SDA_OUT1();
	MyI2C_W_SDA(0);
	I2C_Delay();
	MyI2C_W_SCL(1);
	I2C_Delay();
	MyI2C_W_SDA(1);
	I2C_Delay();
}

void MyI2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	SDA_OUT1();
	for(i = 0;i<8;i++)
	{
		MyI2C_W_SDA(Byte & (0x80>>i));
		I2C_Delay();
		MyI2C_W_SCL(1);
		I2C_Delay();
		MyI2C_W_SCL(0);
		I2C_Delay();
	}
}

uint8_t MyI2C_ReceiveByte(void)
{
	SDA_IN1();
	uint8_t i,Date = 0x00;
	MyI2C_W_SDA(1);
	I2C_Delay();
	for(i = 0;i<8;i++)
	{
		MyI2C_W_SCL(1);
		I2C_Delay();
		if(MyI2C_R_SDA() == 1)
		{
			Date |= (0x80>>i);
			I2C_Delay();
		}
		MyI2C_W_SCL(0);
		I2C_Delay();
	}
	return Date;
}

void MyI2C_SendAck(uint8_t AckBit)
{
		SDA_OUT1();
		MyI2C_W_SDA(AckBit);
		I2C_Delay();
		MyI2C_W_SCL(1);
		I2C_Delay();
		MyI2C_W_SCL(0);
		I2C_Delay();
}

uint8_t MyI2C_ReceiveAck(void)
{
	SDA_IN1();
	uint8_t AckBit = 0x00;
	MyI2C_W_SDA(1);
	I2C_Delay();
	MyI2C_W_SCL(1);
	I2C_Delay();
	AckBit = MyI2C_R_SDA();
	I2C_Delay();
	MyI2C_W_SCL(0);
	I2C_Delay();
	return AckBit;
}
